package demo.mqtt;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.mqtt.server.ServerConsumer;
import com.alibaba.mqtt.server.callback.StatusListener;
import com.alibaba.mqtt.server.config.ChannelConfig;
import com.alibaba.mqtt.server.config.ConsumerConfig;
import com.alibaba.mqtt.server.model.StatusNotice;
/**
 * @author wangly on @date 2024/3/25
 */
public class MQTTClientStatusNoticeProcessDemo {
    public static void main(String[] args) throws Exception {
        /**
         * 您创建的云消息队列 MQTT 版的实例接入点。
         * 获取云端SDK的接入点，请联系云消息队列 MQTT 版技术支持，钉钉群号：35228338。。
         * 接入点地址必须填写分配的域名，不得使用IP地址直接连接，否则可能会导致服务端异常。
         */
        String domain = MqttConfig.instanceId+"-server-internet.mqtt.aliyuncs.com";

        /**
         * 使用的协议和端口必须匹配，该参数值固定为5672。
         */
        int port = 5672;

        /**
         * 您创建的云消息队列 MQTT 版的实例ID。
         */
        String instanceId = MqttConfig.instanceId;

        /**
         * AccessKey ID，阿里云身份验证，在阿里云RAM控制台创建。
         * 阿里云账号AccessKey拥有所有API的访问权限，建议您使用RAM用户进行API访问或日常运维。
         * 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里，否则可能导致AccessKey泄露，威胁您账号下所有资源的安全。
         * 本示例以将AccessKey 和 AccessKeySecret 保存在环境变量为例说明。
         */
        String accessKey = MqttConfig.AccessKey;
        /**
         * AccessKey Secret，阿里云身份验证，在阿里云RAM控制台创建。仅在签名鉴权模式下需要设置。
         */
        String secretKey = MqttConfig.SecretKey;

        /**
         * 您在云消息队列 MQTT 版控制台创建的Group的ID。
         * */
        String mqttGroupId = MqttConfig.GROUP_ID;

        ChannelConfig channelConfig = new ChannelConfig();
        channelConfig.setDomain(domain);
        channelConfig.setPort(port);
        channelConfig.setInstanceId(instanceId);
        channelConfig.setAccessKey(accessKey);
        channelConfig.setSecretKey(secretKey);

        ServerConsumer serverConsumer = new ServerConsumer(channelConfig, new ConsumerConfig());
        serverConsumer.start();
        serverConsumer.subscribeStatus(mqttGroupId, new StatusListener() {
            @Override
            public void process(StatusNotice statusNotice) {
                System.out.println(JSONObject.toJSONString(statusNotice));
            }
        });
    }
}
